package com.dc.project.workflow.service;

import java.util.List;
import java.util.Map;

/**
 * @author zhuangcy
 * @date 2021/6/29
 * @description 流程引擎服务接口
 */
public interface ProcessEngineService {


    /**
     * 启动流程（带业务ID）
     *
     * @param deploymentId 流程发布ID
     * @param businessId   业务ID
     * @param startUser    流程发起人
     * @return 活动任务ID
     */
    String start(String deploymentId, String businessId, String startUser);

    /**
     * 提交任务
     *
     * @param flowVariables 流程表单流转数据
     */
    void submitTask(Map<String, Object> flowVariables);

    /**
     * 根据一个流程实例的id挂起流程实例
     *
     * @param processInstanceId 流程实例id
     */
    void suspendProcessInstance(String processInstanceId);

    /**
     * 根据一个流程实例的id激活流程实例
     *
     * @param processInstanceId 流程实例id
     */
    void activateProcessInstance(String processInstanceId);

    /**
     * 根据发布id批量挂起流程
     *
     * @param deploymentIds 发布ID
     */
    void suspendProcessDefinitionByIds(List<String> deploymentIds);

    /**
     * 根据发布id批量激活流程
     *
     * @param deploymentIds 发布ID
     */
    void activateProcessDefinitionByIds(List<String> deploymentIds);

    /**
     * 撤回审批
     *
     * @param oldTaskId 已审批的任务ID
     */
    void withdrawApproval(String oldTaskId);

    /**
     * 获取当前用户任务流转数据
     *
     * @param taskId 当前任务ID
     * @return map
     */
    Map<String, Object> getCurrentUserTaskVariables(String taskId);

    /**
     * 回退首环节
     *
     * @param taskId 任务ID
     */
    void backToFirstNode(String taskId);

    /**
     * 回退首环节
     *
     * @param taskId
     * @param comment 描述
     */
    void backToFirstNode(String taskId, String comment);


    /**
     * 回退上一环节
     *
     * @param taskId 任务ID
     * @return
     */
    boolean backToPreNode(String taskId);

    /**
     * 回退上一环节
     *
     * @param taskId  任务ID
     * @param comment 审批意见
     * @return
     */
    boolean backToPreNode(String taskId, String comment);

    /**
     * 回退某环节
     *
     * @param taskId
     * @param targetNodeId
     * @param comment
     * @return
     */
    boolean backToAnyNode(String taskId, String targetNodeId, String comment);

    /**
     * 回退某环节
     *
     * @param taskId       任务ID
     * @param targetNodeId 目标节点ID
     * @return
     */
    boolean backToAnyNode(String taskId, String targetNodeId);
}
